Fix precision loss in Duration::mul_f32/f64 and div_f32/f64 #151768
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #149794
Summary
The previous implementation converted the entire
Durationtof64before multiplying/dividing, which caused precision loss becauseDurationhas ~93 bits of precision (u64 secs + u32 nanos) butf64only has 53 bits of mantissa.This caused issues like:
Duration::MAX.mul_f32(1.0)panicking due to overflowd.mul_f64(1.0)not preserving the exact valueSolution
Multiply/divide seconds and nanoseconds separately, then combine the results. This preserves precision for the common case while properly handling edge cases.
Changes
duration_from_float_secs()to reduce code duplication#[track_caller]to all four methods for better panic messagesis_infinite()checked_add().max(0.0)to handle floating-point rounding errorsTest plan